#ifndef XDECODE_TASK_H
#define XDECODE_TASK_H
#include "xdecode.h"
#include "xtools.h"
class XCODEC_API XDecodeTask : public XThread {
public:
	/// @brief 打开解码器
	/// @param para
	/// @return
	bool Open(AVCodecParameters* para);
	// 责任链处理函数
	void Do(AVPacket* pkt) override;
	// 线程主函数
	void Main() override;
	// 线程安全，不会直接返回frame_，而是新建一个bin对frame_进行引用计数加一
	// 需要need_view_来控制，调用后会把need_view_ = false
	AVFrame* GetFrame();
	//
	void set_stream_index(int i) { stream_index_ = i; }
	//
	void set_frame_cache(bool f) { frame_cache_ = f; }

	bool is_open()const { return is_open_; }

	void set_syn_pts(long long p) { syn_pts_ = p; }
	
	void set_block_size(int s) { block_size_ = s; }

	//
	void Stop()override;

	//
	long long cur_ms()const { return cur_ms_; }
	void set_time_base(const AVRational* time_base);
	//
	void Clear();

private:
	long long cur_pts_ = -1;// 当前解码到的pts（以解码数据为准）
	AVRational *time_base_=nullptr;
	//
	long long cur_ms_=0;
	int block_size_ = 100;  // 阻塞大小
	long long syn_pts_ = -1;// 同步时间，-1不同步
	bool is_open_ = false;  // 是否打开
	std::mutex mtx_;
	XDecode decode_;
	XAVPacketList pkt_list_;
	AVFrame* frame_ = nullptr;  // 解码出来的帧
	bool need_view_ = false;    // 是否需要渲染，没帧只能渲染一次
	int stream_index_ = 0;      // 
	//////////解码出来的帧的缓存//////////////
	std::list<AVFrame*> frames_;// 解码出来的帧的缓存队列
	bool frame_cache_ = false;  // 是否缓frame,为true那么解码出来的数据会缓存到frames_
};
#endif